/**
 * 初始化词条脚本
 * 用于快速在数据库中插入必需的词条
 */

require('dotenv').config();
const mongoose = require('mongoose');
const Product = require('../models/Product');
const Translation = require('../models/Translation');

// 连接数据库
const connectDB = async () => {
  try {
    await mongoose.connect(process.env.MONGODB_URI || 'mongodb://localhost:27017/i18n-platform', {
      useNewUrlParser: true,
      useUnifiedTopology: true,
    });
    console.log('✓ 数据库连接成功');
  } catch (error) {
    console.error('✗ 数据库连接失败:', error);
    process.exit(1);
  }
};

// 词条数据
const translationsData = [
  {
    key: 'nav.home',
    namespace: 'common',
    locales: {
      'zh-CN': '首页',
      'en-US': 'Home'
    }
  },
  {
    key: 'nav.about',
    namespace: 'common',
    locales: {
      'zh-CN': '关于',
      'en-US': 'About'
    }
  },
  {
    key: 'app.brand',
    namespace: 'common',
    locales: {
      'zh-CN': '我的应用',
      'en-US': 'My App'
    }
  },
  {
    key: 'app.loading',
    namespace: 'common',
    locales: {
      'zh-CN': '加载中...',
      'en-US': 'Loading...'
    }
  },
  {
    key: 'app.refresh',
    namespace: 'common',
    locales: {
      'zh-CN': '刷新',
      'en-US': 'Refresh'
    }
  },
  {
    key: 'app.refreshSuccess',
    namespace: 'common',
    locales: {
      'zh-CN': '词条已刷新',
      'en-US': 'Translations refreshed'
    }
  },
  {
    key: 'app.refreshFailed',
    namespace: 'common',
    locales: {
      'zh-CN': '刷新失败',
      'en-US': 'Refresh failed'
    }
  },
  {
    key: 'app.refreshError',
    namespace: 'common',
    locales: {
      'zh-CN': '刷新失败',
      'en-US': 'Refresh error'
    }
  },
  {
    key: 'app.platformUnavailable',
    namespace: 'common',
    locales: {
      'zh-CN': '平台不可用',
      'en-US': 'Platform unavailable'
    }
  },
  {
    key: 'app.localeSwitched',
    namespace: 'common',
    locales: {
      'zh-CN': '已切换到 {locale}',
      'en-US': 'Switched to {locale}'
    }
  },
  {
    key: 'app.localeSwitchFailed',
    namespace: 'common',
    locales: {
      'zh-CN': '切换语言失败',
      'en-US': 'Language switch failed'
    }
  },
  {
    key: 'app.footer',
    namespace: 'common',
    locales: {
      'zh-CN': '所有文案来自国际化平台',
      'en-US': 'All text from i18n platform'
    }
  },
  {
    key: 'home.welcome',
    namespace: 'common',
    locales: {
      'zh-CN': '欢迎',
      'en-US': 'Welcome'
    }
  },
  {
    key: 'home.description',
    namespace: 'common',
    locales: {
      'zh-CN': '这是一个使用国际化平台的应用',
      'en-US': 'This is an app using i18n platform'
    }
  },
  {
    key: 'about.description',
    namespace: 'common',
    locales: {
      'zh-CN': '关于这个应用',
      'en-US': 'About this application'
    }
  }
];

// 主函数
async function initTranslations() {
  await connectDB();

  try {
    // 获取或创建产品（默认产品代码：TESTAPP）
    const productCode = process.env.DEFAULT_PRODUCT_CODE || 'TESTAPP';
    let product = await Product.findOne({ code: productCode.toUpperCase() });

    if (!product) {
      console.log(`创建产品: ${productCode}`);
      product = new Product({
        name: '测试应用',
        code: productCode.toUpperCase(),
        description: '用于测试的示例应用',
        supportedLocales: ['zh-CN', 'en-US'],
        defaultLocale: 'zh-CN',
        enabled: true
      });
      await product.save();
      console.log('✓ 产品创建成功');
    } else {
      console.log(`✓ 找到产品: ${product.name} (${product.code})`);
    }

    // 插入词条
    console.log('\n开始插入词条...');
    let created = 0;
    let updated = 0;
    let skipped = 0;

    for (const transData of translationsData) {
      try {
        // 检查词条是否已存在
        const existing = await Translation.findOne({
          productId: product._id,
          namespace: transData.namespace,
          key: transData.key,
          deleted: false
        });

        if (existing) {
          // 更新现有词条
          Object.entries(transData.locales).forEach(([locale, value]) => {
            existing.locales.set(locale, value);
          });
          existing.status = 'published'; // 设置为已发布
          await existing.save();
          updated++;
          console.log(`  ↻ 更新: ${transData.key}`);
        } else {
          // 创建新词条
          const translation = new Translation({
            key: transData.key,
            namespace: transData.namespace,
            productId: product._id,
            locales: new Map(Object.entries(transData.locales)),
            status: 'published', // 直接设置为已发布
            createdBy: 'script'
          });
          await translation.save();
          created++;
          console.log(`  ✓ 创建: ${transData.key}`);
        }
      } catch (error) {
        if (error.code === 11000) {
          // 重复键错误（可能由于并发）
          skipped++;
          console.log(`  ⊘ 跳过: ${transData.key} (已存在)`);
        } else {
          console.error(`  ✗ 失败: ${transData.key}`, error.message);
        }
      }
    }

    console.log('\n================================');
    console.log('词条初始化完成！');
    console.log(`  创建: ${created} 个`);
    console.log(`  更新: ${updated} 个`);
    console.log(`  跳过: ${skipped} 个`);
    console.log(`  总计: ${translationsData.length} 个`);
    console.log(`\n产品代码: ${product.code}`);
    console.log('================================\n');

  } catch (error) {
    console.error('初始化失败:', error);
    process.exit(1);
  } finally {
    await mongoose.connection.close();
    console.log('数据库连接已关闭');
    process.exit(0);
  }
}

// 运行脚本
initTranslations();

